#!/usr/bin/env python
# coding: utf-8

# 日期：2020-11-16
# 撰写人：庄家薇  
# 
# -----
# 
# ## 课堂学习内容：
# 
# > * 1、高德API-WEB服务    
# > * 2、API经济成本的预估（调用量、并发量）   
# > * 3、地理编码、逆地理编码
# > * 4、路径规划
# > * 5、行政区域查询
# > * 6、搜索POI
# > * 7、IP定位
# > * 8 批量请求接口
# > * 9 静态地图
# > * 10 坐标转换
# > * 11 天气查询
# > * 12 输入提示
# > * 13 交通态势（已停止服务）
# 
# ## 课后练习：
# 
# > * 1、[地理编码](https://lbs.amap.com/api/webservice/guide/api/georegeo)   
# > * 2、[路径规划](http://lbs.amap.com/api/webservice/guide/api/direction)   
# ...

# # 准备工作

# In[3]:


import requests,json
import pandas as pd
zhuang_key = "1a8b4a8f8eacf6e72af8287289e0e270"


# ### 一、地理编码
# 
# > * 应用场景：将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。 能够应用在高考学习APP地理学科的高中学生，查询某个地区的经纬度供后续的地理学习之用。  
# 
# > * 结构化地址举例：北京市朝阳区阜通东大街6号转换后经纬度：116.480881,39.989410  
# 
# > * 地标性建筑举例：天安门转换后经纬度：116.397499,39.908722  
# 
# > * 结构化地址的定义： 首先，地址肯定是一串字符，内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意：针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略，但省、市、城镇等级别的地址构成是不能忽略的。暂时不支持返回台湾省的详细地址信息  
# 
# > * 2、url:https://restapi.amap.com/v3/geocode/geo?parameters      
# > * 3、requests.get()       
# > * 4、参数：   
# > * A.必选：key（高德API秘钥），address(结构化地址)  
# > * B.可选：

# In[20]:


#### 准备数据 请思考：高德API是怎么获取数据的？数据库查询
中大南方_address = "广东省广州市中山大学南方学院"
华农_address = "广东省广州市华南农业大学"
长隆_address = "广东省广州市长隆"


# In[21]:


url = "https://restapi.amap.com/v3/geocode/geo?parameters"
params = {
    "key":zhuang_key,
    "address":中大南方_address,
}
# positional argument follows keyword argument
# pa 一定要放在前面，keyword argument放在末尾！！！可以
response = requests.get(url,params=params)
response


# In[22]:


response.json()


# In[23]:


中大南方_location = response.json()['geocodes'][0]['location']
中大南方_location


# In[24]:


new_url = "https://restapi.amap.com/v3/geocode/geo?parameters"
params = {
    "key":zhuang_key,
    "address":华农_address,
}
# positional argument follows keyword argument
# pa 一定要放在前面，keyword argument放在末尾！！！可以
response = requests.get(url,params=params)
response


# In[25]:


华农_location = response.json()['geocodes'][0]['location']
华农_location


# In[26]:


new_url = "https://restapi.amap.com/v3/geocode/geo?parameters"
params = {
    "key":zhuang_key,
    "address":长隆_address,
}
response = requests.get(url,params=params)
response


# In[27]:


长隆_location = response.json()['geocodes'][0]['location']
长隆_location


# In[ ]:


### 小结：


# ### 二、逆地理编码
# > * 定义：将经纬度转换为详细结构化的地址，且返回附近周边的POI、AOI信息。
# 例如：116.480881,39.989410 转换地址描述后：北京市朝阳区阜通东大街6号。  
# 
# > * 应用场景：知道某个经纬度可查询出具体地址，有助于地理地图绘制更加精准方便；或者应用于国家航空事业的火箭精准落地，避免在密集人群落地造成意外和不便。  
# 
# > * A.url : https://restapi.amap.com/v3/geocode/regeo?parameters    
# > * B.requests.get()    
# > * C.参数：
# > * 1、必选：key,location(经纬度坐标)
# > * 2、可选: extensions[(默认：base)可选"all",描述数据详细指数]

# In[28]:


# 数据准备 中大南方_location


# In[29]:


# 逆地理编码函数
def regeo(key,location,extensions="base",radius=None,poitype=None):
    """"""
    url = "https://restapi.amap.com/v3/geocode/regeo?parameters"
    params = {
        "key":key,
        "location":location,
        "extensions":extensions,
        "radius":radius,
        "poitype":poitype
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[32]:


url = "https://restapi.amap.com/v3/geocode/regeo?parameters"
params = {
    "key":zhuang_key,
    "location":中大南方_location,
    "extensions":"all"
}
r = requests.get(url,params)
r


# In[33]:


_roads_ = []
for item in r.json()['regeocode']['roads']:
#     print(item['name'])
    _roads_.append(item['name'])
_roads_


# In[34]:


r.json()


# In[35]:


a=[]
for i in r.json()['regeocode']['pois'][6]['name']:
    a.append(i)
print(a)
        


# In[36]:


name=[]
name.append(r.json()['regeocode']['pois'][0]['name'])
name.append(r.json()['regeocode']['pois'][1]['name'])
name.append(r.json()['regeocode']['pois'][2]['name'])
name.append(r.json()['regeocode']['pois'][3]['name'])
name.append(r.json()['regeocode']['pois'][4]['name'])
name.append(r.json()['regeocode']['pois'][5]['name'])


# In[37]:


print(name)


# ### 三、路径规划
# >* 1.定义:路径规划API是一套以HTTP形式提供的步行、公交、驾车查询及行驶距离计算接口，返回JSON 或 XML格式的查询数据，用于实现路径规划功能的开发  
# 
# >* 应用场景：语音GPS导航/盲人专用的个性化定制语音导航耳机  
# 
# >* A.url :https://restapi.amap.com/v3/geocode/geo?parameters
# >* B.requests.get()
# >* C.参数：
# >>* 必选：key，address,city,batch
# 

# In[43]:


# 数据准备： 
origin = "113.679287,23.632575" 
destination = ""


# In[44]:


def geocode(key,address,city=None,batch=None)->str:
    """获取高德API的地理编码
    注释：key是指高德API的秘钥，请先去注册
          address是指结构化地址，具体请查看：https://lbs.amap.com/api/webservice/guide/api/georegeo   
    """
    url = "https://restapi.amap.com/v3/geocode/geo?parameters"
    params = {
        "key":zhuang_key,
        "address":address,
        "city":city,
        "batch":batch
    }
    response = requests.get(url,params=params)
    results = response.json()['geocodes'][0]['location']
    # 返回值
    return results
    


# In[45]:


response.json()


# In[46]:


起始点_中大南方 = origin
起始点_中大南方


# In[50]:


目的地_长隆 = destination
目的地_长隆


# ### 四、 步行 
# > * 定义：路径规划API是一套以HTTP形式提供的步行、公交、驾车查询及行驶距离计算接口，返回JSON 或 XML格式的查询数据，用于实现路径规划功能的开发。  
# 
# >* 应用场景：校内竞走或有关行走路线的体育比赛 /校内或较小区域内的产品内嵌导航功能  
# 
# > * 1、url:https://restapi.amap.com/v3/direction/walking?parameters    > * 2、requests.get()
# > * 3、参数：
# > * A.必选：key，origin（出发点（经度，纬度））,destination（目的地（经度，纬度））
# > * B.可选：callback,output,sig

# In[51]:


# 步行
url = "https://restapi.amap.com/v3/direction/walking?parameters"
params = {
    "key":zhuang_key,
    "origin":起始点_中大南方,
    "destination":目的地_长隆
}
r = requests.get(url,params)
r


# In[52]:


r.json()['route']['paths']


# ### 五、 公交
# >* 定义：公交路径规划 API 可以规划综合各类公共（火车、公交、地铁）交通方式的通勤方案，并且返回通勤方案的数据。  
# 
# >* 应用场景：地铁内的电子地铁路线牌  
# 
# >* requests.get（）
# >* 必选参数：key,origin,destination,city
# >* 可选参数：cityd,extensions,strategy,nightflag,date,time,sig,output,callback

# In[53]:


origin = "113.357083,23.157434"
destination = "113.264434,23.129162"
city =  "广州"


# In[54]:


华农_address = "广东省广州市华南农业大学"
长隆_address = "广东省广州市长隆"
def bus(zhuang_key,origin,destination,city):
    z_url = "https://restapi.amap.com/v3/direction/transit/integrated?parameters"
    params = {
        "key":zhuang_key,
        "origin":origin,
        "destination":destination,
        "city":city,
    }
    r = requests.get(z_url,params=params)
    result = r.json()
    return result


# In[55]:


a=bus(zhuang_key,origin,destination,city)
a


# In[56]:


pd.json_normalize(a["route"]["transits"])


# In[57]:


方案一 = pd.json_normalize(a["route"]["transits"][0])
方案一


# In[58]:


pd.json_normalize(a["route"]["transits"])["cost"]


# ### 六、行政区域查询
# >* 定义：行政区域查询是一类简单的HTTP接口，根据用户输入的搜索条件可以帮助用户快速的查找特定的行政区域信息。  
# 
# >* 应用场景：人口普查等政务相关的全国性行政工作 / 制作疫情地图 /全国各地高校行政分布查询
# 
# >* requests.get（）
# >* 必选参数：key
# >* 可选参数：keywords，page等

# In[11]:


xz_url="https://restapi.amap.com/v3/config/district?parameters"
keywords="山东"
subdistrict="2"


# In[12]:


def xingzheng(zhuang_key,keywords,subdistrict):
    params = {
        "key":zhuang_key,
        "keywords":keywords,
        "output":"json",
        "subdistrict":subdistrict,
    }
    result = requests.get(xz_url,params=params)
    return result


# In[13]:


b = xingzheng(zhuang_key,keywords,subdistrict)
b


# In[14]:


b.json()


# ### 七、 搜索POI
# >* 定义：搜索服务API是一类简单的HTTP接口，提供多种查询POI信息的能力，其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。  
# 
# >* 应用场景：美团外卖大众点评等APP内嵌的周边游玩推荐，附近推荐等小功能。  
# 
# >* requests.get（）
# >* 必选参数：key，keywords，types
# >* 可选参数：city，citylimit，children，offset，page，extensions，sig，output，callback

# In[16]:


poi_url="https://restapi.amap.com/v3/config/district?parameters"
keywords = "大学"
city = "广州"
citylimit = "true"


# In[17]:


def poi(keywords,city,citylimit=None):
    params={
    "key":zhuang_key,
    "keywords":keywords,
    "city":city,
    "citylimit":citylimit,
}
    result = requests.get(poi_url,params=params)
    return result


# In[18]:


poi = poi(keywords,city,citylimit=None)
poi


# In[19]:


poi.json()


# ### 八、 IP定位
# >* 定义：IP定位是一个简单的HTTP接口，根据用户输入的IP地址，能够快速的帮用户定位IP的所在位置。
# 
# >* 应用场景：查询各大网站IP的所在地址，可间接判断网站服务器是否存在病毒入侵的安全隐患。  
# 
# >* requests.get（）
# >* 必选参数：key
# >* 可选参数：iP，sig，output

# In[82]:


ip_url="https://restapi.amap.com/v3/ip?parameters"
ip="114.247.50.2"


# In[83]:


def ip(zhuang_key,ip):
    params={
    "key":zhuang_key,
    "ip":ip,
}
    result = requests.get(ip_url,params=params)
    return result


# In[84]:


ip = ip(zhuang_key,ip)
ip


# In[85]:


ip.json()


# In[86]:


r


# In[87]:


r.json()


# ### 九、静态地图
# >* 定义：静态地图服务通过返回一张地图图片响应HTTP请求，使用户能够将高德地图以图片形式嵌入自己的网页中。用户可以指定请求的地图位置、图片大小、以及在地图上添加覆盖物，如标签、标注、折线、多边形。   
# 
# >* 应用场景：供用户调用功能制作某区域的地图，如制作中大南方的校内区域地图。  
# 
# >* requests.get（）
# >* 必选参数：key，location（部分条件必选），zoom
# >* 可选参数：size，scale，markers，labels，paths，traffic，sig

# In[4]:


jt_url = "https://restapi.amap.com/v3/staticmap?parameters"
location = "113.316554,23.124708"
zoom = "1,10"
scale = "1"


# In[5]:


params={
    "key":zhuang_key,
    "location":location,
    "zoom":zoom,
    "scale":scale,
}
r = requests.get(jt_url,params=params)


# In[6]:


r


# In[7]:


r.json()


# In[8]:


def jingtai(zhuang_key,location,zoom,scale):
    params ={
        "key":zhuang_key,
        "location":location,
        "zoom":zoom,
        "scale":scale,
    }
    r = requests.get(jt_url,params=params)
    result = r.json()
    return result


# In[9]:


a = jingtai(zhuang_key,location,zoom,scale)
a


# ### 十、 坐标转换
# >* 定义：坐标转换是一类简单的HTTP接口，能够将用户输入的非高德坐标（GPS坐标、mapbar坐标、baidu坐标）转换成高德坐标。  
# 
# >* 应用场景：使用户能够更加直接地享受高德地图服务，以供自己的学习研究或商业需求。  
# 
# >* requests.get（）
# >* 必选参数：key，locations
# >* 可选参数：coordsys，sig，output

# In[1]:


zb_url="https://restapi.amap.com/v3/assistant/coordinate/convert?parameters"
locations="116.481499,39.990475|116.481499,39.990375"
coordsys="gps"


# In[6]:


def zuobiao(gao_key,locations,coordsys=None):
    params={
        "key":zhuang_key,
        "locations":locations,
        "coordsys":coordsys,
    }
    r=requests.get(zb_url,params=params)
    return r


# In[7]:


e = zuobiao(zhuang_key,locations,coordsys=None)
e


# In[8]:


e.json()


# ### 十一、 天气查询
# >* 定义：天气查询是一个简单的HTTP接口，根据用户输入的adcode，查询目标区域当前/未来的天气情况。  
# 
# >* 应用场景：各大网站首页边角的天气预报小组件等。  
# 
# >* requests.get（）
# >* 必选参数：key，city
# >* 可选参数：extensions，output

# In[13]:


tq_url="https://restapi.amap.com/v3/weather/weatherInfo?parameters"
city = "110000"
extensions="all"


# In[14]:


def tianqi(gao_key,city,extensions):
    params={
    "key":zhuang_key,
    "city":city,
    "extensions":extensions,}
    r = requests.get(tq_url,params=params)
    return r


# In[15]:


a = tianqi(zhuang_key,city,extensions)
a


# In[16]:


a.json()


# ### 十二、 输入提示
# >* 定义：输入提示是一类简单的HTTP接口，提供根据用户输入的关键词查询返回建议列表。  
# 
# >* 应用场景：地图类应用或软件的内嵌搜索引擎  
# 
# >* requests.get（）
# >* 必选参数：key，keywords
# >* 可选参数：type，location，city，citylimit，datatype，sig，output，callback

# In[24]:


keywords="星巴克"
location="113.316554,23.124708"
city="广州"
citylimit="true"
output="json"
zhuang_key="1a8b4a8f8eacf6e72af8287289e0e270"


# In[25]:


def tips(zhuang_key,keywords,location,city):
    tips_url="https://restapi.amap.com/v3/assistant/inputtips?parameters"
    params={
        "keywords":keywords,
        "key":zhuang_key,
        "location":location,
        "city":city,
        "output":output,
    }
    t=requests.get(tips_url,params=params)
    return t


# In[26]:


a = tips(zhuang_key,keywords,location,city)
a.json()


# ## 交通态势与批量请求接口

# 高德地图API文档内已注明“说明：交通态势接口计划将于2020年12月31日下线，目前不再对新用户开放。如需合作请通过工单进行商务咨询。”  
# 
# 交通态势-API文档-开发指南-Web服务 API | 高德地图API  https://lbs.amap.com/api/webservice/guide/api/trafficstatus

# 特别说明：受产品策略调整影响，自2020年11月起，建议您不再使用此批量接口。后续平台会逐步废弃并下线此服务。
# 批量请求接口-API文档-开发指南-Web服务 API | 高德地图API  https://lbs.amap.com/api/webservice/guide/api/batchrequest

# In[ ]:




